import 'dart:async';

import 'package:english_words/english_words.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  VoidCallback? method1;

  void method2() {
    print("method2答应");
  }
  method1 = method2;

  Future.delayed(Duration(seconds: 2), () {
    return "hi world!";
  }).then((data) {
    print(data);
    print("调用method1变量方法会触发method2方法，因为在前面我将method2赋值给了method1函数变量");
    method1!();
    method2();
  });

  FutureOr<String> mainFutureString() {
    return "";
  }



  Future.delayed(Duration(seconds: 2), mainFutureString).then((data) {
    print(data);
    throw AssertionError("Error");
  }).catchError((e) {
    //执行失败会走到这里
    print(e);
  }).whenComplete(() {
    //无论成功或失败都会走到这里
    print("whenComplete");
  });


  //连接两个异步任务 合并
  Future.wait([
    // 2秒后返回结果
    Future.delayed(Duration(seconds: 2), () {
      return "hello";
    }),
    // 4秒后返回结果
    Future.delayed(Duration(seconds: 4), () {
      return " world 拼接";
    })
  ]).then((results){
    print(results[0]+results[1]);
  }).catchError((e){
    print(e);
  });


  void execute(var callback) {
    callback();
  }

  execute(() => print("xxx"),);
  execute(() {
    print("xxx");
    print("xxx");
  });
  execute(() => {
    print("xxx"),
    print("xxx")

  });
}
task() async {
  try{
    Object fun = (){};//所以任何类型的数据都可以赋值给Object声明的对象
    dynamic fun3 = (){};//dynamic与Object不同的是dynamic声明的对象编译器会提供所有可能的组合，而Object声明的对象只能使用 Object 的属性与方法, 否则编译器会报错，如:
    final fun1 =  (a){return a;};//final 变量只能被设置一次，两者区别在于：const 变量是一个编译时常量（编译时直接替换为常量值），final变量在第一次使用时被初始化。被final或者const修饰的变量，变量类型可以省略，如：
    // const  fun2 = (a){return a;};//Const变量必须用常量值初始化。
    var fun5 = "";//第一次赋值确定变量类型
    fun5 ="11";

    //async用来表示函数是异步的，定义的函数会返回一个Future对象，可以使用 then 方法添加回调函数。
    // await 后面是一个Future，表示等待该异步任务完成，异步完成后才会往下走；await必须出现在 async 函数内部。
    
    // String id = await getUserInfo("alice","******");
    // String userInfo = await getUserInfo(id);
    // await saveUserInfo(userInfo);
    //执行接下来的操作
  } catch(e){
    //错误处理
    print(e);
  }
}
void test1() {
  Function? add = (int x, int y) {
    print("匿名函数${x + y}");
    return x + y;
  };

  add5(int a, int b, {int c = 0, int d = 0, Function? add}) =>
      print("可选参数：" + (a + b + c + d).toString());

  var value = add5(5, 6, c: 1, d: 5);
  // var value=add5(5,6, c: 1,d: 5,add: add(7,8));有问题
  var valueAdd = add(5, 6);
}

void test2() {
  //  Function square = (a) {
  //   return a * a;
  // };
  //
  // Function? square2 = (a) {
  //   return a * a * a;
  // };
  // num add(num a, num b, {required num op, Function? op2}) {
  //   //函数作为参数传递
  //   return op()+op2!(b);
  // }
  //
  // add(3, 4, op:square, op2:square2(5));
}

//定义函数类型的参数，格式为：【返回值 函数名(参数)】
void testFunction(void f(num a)) {
  f(1);
}
